import java.util.ArrayList;
import java.util.List;

public class StringExtractor {

    // 状态枚举
    private enum State {
        NORMAL,     // 普通字符状态
        STRING_START, // 字符串开始状态（遇到第一个双引号）
        STRING_INSIDE, // 字符串内部状态
        ESCAPE      // 转义字符状态
    }

    // 提取字符串的方法
    public List<String> extractStrings(String sourceCode) {
        List<String> strings = new ArrayList<>();
        StringBuilder currentString = new StringBuilder();
        State currentState = State.NORMAL;
        boolean escapeNext = false;

        for (int i = 0; i < sourceCode.length(); i++) {
            char currentChar = sourceCode.charAt(i);

            switch (currentState) {
                case NORMAL:
                    if (currentChar == '"') {
                        currentState = State.STRING_START;
                    }
                    // 在NORMAL状态下，我们不需要做其他事情，因为字符串还没有开始
                    break;

                case STRING_START:
                    // 检查是否为空字符串（即两个连续的双引号）
                    if (i + 1 < sourceCode.length() && sourceCode.charAt(i + 1) == '"') {
                        i++; // 跳过下一个双引号
                        currentState = State.NORMAL; // 回到普通状态
                    } else {
                        currentState = State.STRING_INSIDE;
                    }
                    break;

                case STRING_INSIDE:
                    if (escapeNext) {
                        // 添加转义后的字符到当前字符串中
                        currentString.append(currentChar);
                        escapeNext = false; // 重置转义标志
                    } else if (currentChar == '\\') {
                        escapeNext = true; // 设置转义标志
                    } else if (currentChar == '"') {
                        // 字符串结束，将当前字符串添加到结果列表中
                        strings.add(currentString.toString());
                        currentString.setLength(0); // 清空StringBuilder以便下一个字符串
                        currentState = State.NORMAL;
                    } else {
                        // 普通字符，添加到当前字符串中
                        currentString.append(currentChar);
                    }
                    break;

                case ESCAPE:
                    throw new IllegalStateException("Unexpected state: ESCAPE");

                default:
                    throw new IllegalStateException("Unexpected value: " + currentState);
            }
        }

        // 检查是否有不完整的字符串
        if (currentState == State.STRING_INSIDE) {
            throw new IllegalArgumentException("Unclosed string at end of input");
        }

        return strings;
    }

    // 测试方法
    public static void main(String[] args) {
        StringExtractor extractor = new StringExtractor();
        String sourceCode = "String example = \"一般学习一门编程语言的时候，基本上第一个程序是输出\\\"Hello World!\\\"\";";
        List<String> strings = extractor.extractStrings(sourceCode);
        for (String str : strings) {
            System.out.println(str);
        }
    }
}
